import 'package:flutter/material.dart';
import 'package:petitparser/petitparser.dart';

///上下文文敏感解析，可以使用 Parser.callCC 方法来改变解析的行为。
class EOptimizationParser extends StatefulWidget {
  const EOptimizationParser({super.key});

  @override
  State<EOptimizationParser> createState() => _EOptimizationParserState();
}

class _EOptimizationParserState extends State<EOptimizationParser> {
  var resultStr = '';
  final invalidStr = 'Invalid input';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('解析优化'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                Text('待解析数据"abc"'),
                SizedBox(height: 10),
                TextButton(
                    onPressed: () {
                      _buildParser();
                      setState(() {});
                    },
                    child: Text('开始解析')),
                Text('解析结果："'),
                SizedBox(height: 10),
                Container(
                  color: const Color.fromARGB(255, 224, 224, 224),
                  child: Text(resultStr),
                ),
              ],
            ),
          ),
        ));
  }

  void _buildParser() {
    resultStr = '';
    // 创建一个解析器，它期望看到一个 'a' 或 'b' 或 'c'
    final parser = char('a').or(char('b')).or(char('c'));

    // 解析输入，并记录所需时间
    var start = DateTime.now();
    parser.parse('dedfgijklmnopqrstuvwxyzabc');
    var end = DateTime.now();
    resultStr = '优化前所需时间:${end.difference(start)}\n\n';
    print('Before optimization: ${end.difference(start)}');

    // 优化解析器：使用预编译的解析器
    final optimizedParser = parser.end().flatten().trim();

    // 再次解析输入，并记录所需时间
    start = DateTime.now();
    optimizedParser.parse('abc');
    end = DateTime.now();
    resultStr = resultStr + '优化后所需时间:${end.difference(start)}';
    print('After optimization: ${end.difference(start)}');
  }
}
